package com.qixin.util.clazz;

import javassist.*;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;

/**
 * 
 * @author 张子艺
 * @date 2017年3月9日 下午4:06:23
 * @version 1.0
 * @description 类处理工具
 *
 */
public class ClazzUtil {
	/**
	 * 
	 * @author 张子艺
	 * @date 2017年3月9日 下午4:39:56
	 * @version 1.0
	 * @description 获取某个类的某个方法的参数名称列表
	 *
	 * @param clazzName
	 * @param methodName
	 * @return
	 */
	public static String[] getFieldsName(Class<?> cls,String clazzName, String methodName) {
		ClassPool pool = ClassPool.getDefault();  
		ClassClassPath classPath = new ClassClassPath(cls);  
        pool.insertClassPath(classPath); 
        CtClass cc=null;
        CtMethod cm=null;
        String[] paramNames=null;
		try {
			cc = pool.get(clazzName);
			cm = cc.getDeclaredMethod(methodName);  
			paramNames = new String[cm.getParameterTypes().length];
		} catch (NotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
        
  
        // 使用javaassist的反射方法获取方法的参数名  
        MethodInfo methodInfo = cm.getMethodInfo();  
        CodeAttribute codeAttribute = methodInfo.getCodeAttribute();  
        LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);  
        if (attr == null) {  
           return null;
        }  
        int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;  
        for (int i = 0; i < paramNames.length; i++)  
            paramNames[i] = attr.variableName(i + pos);  
        // paramNames即参数名  
        for (int i = 0; i < paramNames.length; i++) {  
            System.out.println(paramNames[i]);  
        }
		return paramNames; 
	}
	
}
